home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / cstdio.arc / SRC.ARC / FNSLONG.A < prev    next >
Text File  |  1984-06-17  |  2KB  |  116 lines

  1. ;    fnslong.a - intrinsic long arithmetic functions.
  2. ;    decoded from DeSmet library.
  3. ;    G. R. Mansfield.  84/06/16.
  4. ;    Ver 1.0-4616.
  5.  
  6.  
  7.     dseg
  8. rs:    db    0        ; result sign
  9.  
  10.     cseg
  11.     public    _mod4
  12.     public    _mul4
  13.     public    _div4
  14.  
  15.  
  16. ;    mod4 - dx,ax = dx,ax % bx,cx.
  17.  
  18. _mod4:    call    _div4
  19.     mov    dx,si
  20.     mov    ax,bx
  21.     ret
  22.  
  23.  
  24. ;    mul4 - dx,ax = dx,ax * bx,cx.
  25.  
  26. _mul4:    call    rrs        ; record result sign
  27.     mov    di,ax
  28.     mov    ax,dx
  29.     mul    cx
  30.     mov    si,ax
  31.     mov    ax,bx
  32.     mul    di
  33.     add    si,ax
  34.     mov    ax,cx
  35.     mul    di
  36.     add    dx,si
  37.     
  38.  
  39. ;    srs - set result sign.
  40.  
  41. srs:    test    byte rs,1
  42.     jz    srs1
  43.     not    dx
  44.     neg    ax
  45.     sbb    dx,0FFFFh
  46. srs1:    test    byte rs,2
  47.     jz    srs2
  48.     not    si
  49.     neg    bx
  50.     sbb    si,0FFFFh
  51. srs2:    ret
  52.  
  53.  
  54. ;    div 4 - dx,ax = dx,ax / bx,cx.
  55.  
  56. _div4:    call    rrs        ; record result sign
  57.     or    bx,bx
  58.     jnz    div2
  59.     cmp    cx,dx
  60.     jna    div1
  61.     div    cx
  62.     xor    si,si
  63.     mov    bx,dx
  64.     xor    dx,dx
  65.     jmp    srs        ; set result sign
  66.  
  67. div1:    mov    bx,ax
  68.     mov    ax,dx
  69.     xor    dx,dx
  70.     div    cx
  71.     xchg    bx,ax
  72.     div    cx
  73.     xchg    dx,bx
  74.     xor    si,si
  75.     jmp    srs        ; set result sign
  76.  
  77. div2:    push    bp
  78.     mov    bp,cx
  79.     mov    di,bx
  80.     xor    si,si
  81.     mov    bx,si
  82.     mov    cx,32
  83. div3:    shl    bx,1
  84.     rcl    si,1
  85.     shl    ax,1
  86.     rcl    dx,1
  87.     adc    bx,0
  88.     sub    bx,bp
  89.     sbb    si,di
  90.     inc    ax
  91.     jnb    div4
  92.     add    bx,bp
  93.     adc    si,di
  94.     dec    ax
  95. div4:    loop    div3
  96.     pop    bp
  97.     jmp    srs        ; set result sign
  98.  
  99.  
  100. ;    rrs - record result sign.
  101.  
  102. rrs:    mov    byte rs,0    ; set positive result    
  103.     or    dx,dx
  104.     jns    rrs1        ; if dx,ax positive
  105.     mov    byte rs,3
  106.     not    dx        ; complement dx,ax
  107.     neg    ax
  108.     sbb    dx,0FFFFh
  109. rrs1:    or    bx,bx
  110.     jns    rrs2
  111.     xor    byte rs,1
  112.     not    bx
  113.     neg    cx
  114.     sbb    bx,0FFFFh
  115. rrs2:    ret
  116.